package es.ugr.beequizz.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.session.SessionRegistry;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import es.ugr.beequizz.bean.InformacionUsuarioBean;
import es.ugr.beequizz.bean.UsuarioBean;
import es.ugr.beequizz.converter.UsuarioConverter;
import es.ugr.beequizz.dto.InformacionUsuarioDTO;
import es.ugr.beequizz.dto.ResultadoDTO;
import es.ugr.beequizz.dto.UsuarioDTO;
import es.ugr.beequizz.services.MailService;
import es.ugr.beequizz.services.UsuarioService;

@Controller
@RequestMapping(value= "/usuario")
public class UsuarioController {
	
	@Autowired
	private UsuarioService usuarioService;
	
	@Autowired
	private UsuarioConverter usuarioConverter;
	
	@Autowired
	private MailService mailService;
	
	@Autowired
	private SessionRegistry sessionRegistry;
	
	@RequestMapping(value= "/nuevoUsuario",method= RequestMethod.POST,
			produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
	@ResponseBody
	public ResultadoDTO nuevoUsuario (@RequestBody UsuarioDTO usuario){
		
		UsuarioBean bean = usuarioConverter.convert(usuario);
		
		usuarioService.nuevoUsuario(bean);	
	
		return new ResultadoDTO("SUCCESS");
	}

	@RequestMapping(value= "/modificarUsuario",method= RequestMethod.POST,
			produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
	@ResponseBody
	public ResultadoDTO modificarUsuario (@RequestBody InformacionUsuarioDTO usuario){
		
		UsuarioBean bean = usuarioConverter.convert(usuario);
		bean.setId(usuario.getId());
		
		usuarioService.modificarUsuario(bean);
			
		return new ResultadoDTO("SUCCESS");
	}

	@RequestMapping(value= "/recuperarUsuario",method= RequestMethod.GET,
	produces = MediaType.APPLICATION_JSON_VALUE)
	@ResponseBody
	public InformacionUsuarioDTO recuperarUsuario (){

		final String apodo = SecurityContextHolder.getContext().getAuthentication().getName();

		UsuarioBean usuario = usuarioService.recuperarUsuario(apodo);

		InformacionUsuarioDTO dto = new InformacionUsuarioDTO();
		dto.setId(usuario.getId());
		dto.setApellidos(usuario.getApellidos());
		dto.setNombre(usuario.getNombre());
		dto.setApodo(usuario.getApodo());
		dto.setMail(usuario.getMail());
		dto.setPassword(usuario.getPassword());

		return dto;
	}
	
	@RequestMapping(value= "/idUsuario",method= RequestMethod.GET,
			produces = MediaType.APPLICATION_JSON_VALUE)
	@ResponseBody
	public Long idUsuario (){
		
		final String username = SecurityContextHolder.getContext().getAuthentication().getName();
		
		Long id = usuarioService.recuperarIdUsuario(username);
		
		return id;
	}
	
	@RequestMapping(value= "/passwordUsuario",method= RequestMethod.GET,
			produces = MediaType.APPLICATION_JSON_VALUE, params = {"username"})
	@ResponseBody
	public ResultadoDTO passwordUsuario(@RequestParam(value="username") String username){
		
//		final String username = SecurityContextHolder.getContext().getAuthentication().getName();
		
		InformacionUsuarioBean informacion = usuarioService.recuperarInformacionUsuario(username);
		
		String mail = informacion.getMail();
		String password = informacion.getPassword();
		
		mailService.mandarPassword(username, mail, password);
		
		return new ResultadoDTO("SUCCESS");
		
		
	}
	
	/*M�todo para verificar que el usuario*/
	@RequestMapping(value= "/validarUsuario", method= RequestMethod.GET, 
			produces = MediaType.APPLICATION_JSON_VALUE, params = {"username"})
	@ResponseBody
	public boolean validarUsuario(@RequestParam(value="username") String username){
		
		Boolean existe = usuarioService.validarUsuario(username);
		
		return existe;
	}
	
	/*M�todo para verificar que la respuesta es correcta*/
	@RequestMapping(value= "/validarNuevoApodo", method= RequestMethod.GET, 
			produces = MediaType.APPLICATION_JSON_VALUE, params = {"username"})
	@ResponseBody
	public boolean validarNuevoApodo(@RequestParam(value="username") String username){

		final String miApodo = SecurityContextHolder.getContext().getAuthentication().getName();
		if (miApodo.equals(username)) {
			return false;
		}
		
		Boolean existe = usuarioService.validarUsuario(username);
		
		return existe;
	}
	

	
}

